fn main() {
    println!("Hello, world!");

    let s1 = String::from("Hello");

    // 不可变引用 
    let r = &s1;

    println!("{}", r);

    println!("Before assignment {}", s1);

    // s1 被移动(move)到 s2
    // Rust 设计选择：Rust 永远也不会自动创建数据的 “深拷贝”
    let s2 = s1;

    //println!("After assignment {}", s1);

    println!("After assignment {}", s2);

    // 给一个已有的变量赋一个全新的值时，Rust 将会立即调用 drop 并释放原始值的内存
    let mut ss = String::from("Hello");
    println!("{ss}");
    ss = String::from("good");
    println!("{ss}");

    // rust 引用
    // Rust提供的一个不用获取所有权就可以使用值的功能
    // 创建一个引用的行为称为 借用（borrowing）

    // 可变引用
    let mut mut_ref_ss = &mut ss;
    mut_ref_ss.push_str(" morning!");
    println!("{}", mut_ref_ss);

    // 不可变引用
    let ref_ss = &ss;
}


//fn dangle_pointer() ->&String {
fn dangle_pointer() ->String {
    let s = String::from("Hello");
    
    //&s
    s
}